package com.bfxy.rabbitmq.api.helloworld;

import java.util.HashMap;
import java.util.Map;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class Sender {

	public static void main(String[] args) throws Exception {

		Connection connection = null;
		Channel channel = null;
		try {
			// 1 创建ConnectionFactory
			ConnectionFactory connectionFactory = new ConnectionFactory();
			connectionFactory.setHost("192.168.218.21");
			connectionFactory.setPort(5672);
			connectionFactory.setVirtualHost("/");

			// 2 创建Connection
			connection = connectionFactory.newConnection();

			// 3 创建Channel
			channel = connection.createChannel();

			// 4 声明
			String queueName = "test001";
			/*
				queueDeclare()方法：用于实现通道与消息队列的绑定。它包含5个参数。
					String queue：被绑定的消息队列名，当该消息队列不存在时，将新建该消息队列
					Boolean durable：是否持久化消息队列，该参数持久化的仅为队列，而不包含队列中的消息
					Boolean exclusive：该通道是 否独占该队列
					Boolean autoDelete：消费完成时是否删除队列，该删除操作在消费者彻底断开连接之后进行
					Map<String, Object> arguments：其他配置参数
			*/
			channel.queueDeclare(queueName, false, false, false, null);

			Map<String, Object> headers = new HashMap<>();
			AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
					.deliveryMode(2) // deliveryMode设置为2，代表将该队列的消息持久化；1代表不将该队列的消息持久化
					.contentEncoding("UTF-8")
					.headers(headers).build();

			// 5 发送
			for (int i = 0; i < 5; i++) {
				String msg = "Hello World RabbitMQ " + i;
				/*
					basicPublish()方法：是基础的发布消息方法，它有四个参数
						String exchange：交换机名，传入空字符串""，默认走AMQP default这个Exchange
						String routingKey：（路由地址）发布消息的队列，无论channel绑定哪个队列，最终发布消息的队列都有该字串指定
						AMQP.BasicProperties props：消息的配置属性，例如 MessageProperties.PERSISTENT_TEXT_PLAIN 表示消息持久化。
						byte[] body：消息数据本体，必须是byte数组
				*/
				channel.basicPublish("", queueName, props, msg.getBytes());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (channel != null) {
				channel.close();
			}
			if (connection != null) {
				connection.close();
			}
		}

	}
	
}
